package cn.caojun.auth.interceptor;


import cn.caojun.auth.annotation.caojunPermission;
import cn.caojun.auth.mapper.PermissionMapper;
import cn.caojun.auth.service.IPermissionScanService;
import cn.caojun.auth.service.Impl.PermisssionService;
import cn.caojun.basic.utils.BasicMap;
import cn.caojun.org.domain.Employee;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
import java.util.List;
import java.util.Objects;

@Component
public class AuthInterceptor implements HandlerInterceptor {

    @Autowired
    public PermissionMapper permissionMapper;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception{


        //登录认证
        String token= request.getHeader("token");
        if (StringUtils.isEmpty(token)){
            response.getWriter().write("{\"success\":false,\"message\":\"noLogin\"}");
            return false;
        }
        Employee loginUser=(Employee) BasicMap.loginMap.get(token);

        if (Objects.isNull(loginUser)){
            response.getWriter().write("{\"success\":false,\"message\":\"noLogin\"}");
            return false;
        }


        //1.权限认证，权限拦截判断当前用户要访问的资源是否有这个权限
        if(handler instanceof HandlerMethod){
            HandlerMethod handlerMethod=(HandlerMethod)handler;
            Method method=handlerMethod.getMethod();
            //1.1判断方法上面是否有注解如果没有说明不需要权限也能访问直接放行
            caojunPermission methodAnnotation=method.getAnnotation(caojunPermission.class);
            if (Objects.isNull(methodAnnotation)){
                return true;
            }
            //2.获取当前用户的所有权限
            List<String> list=permissionMapper.getPermissionByUserId(loginUser.getId());
            //3.获取当前资源的访问权限
            Class<?> aClass=method.getDeclaringClass();
            String sn=aClass.getSimpleName()+":"+method.getName();
            //4.用户是否拥有该权限则，如果有则放行如果没有则返回错误信息
            if (!list.contains(sn)){

                //因为前后端分离项目，前端通过axios发起异步请求，所以后端只能返回具体的结果，而不能访问页面
                //而我们每个接口的返回结果都是{success:message:""},所以我们在后端返回采用拼接字符串的形式，如果与前端格式不一样前端会无法处理
                //这里也可以采用map来进行包装，然后转为JSON字符串，或是用AJaxResult类，AjaxResult类也许要强制转为JSOn字符串的格式
                response.getWriter().write("{\"success\":false,\"message\":\"noPermission\"}");
                return false;
            }
        }
        return true;
    }
}
